package com.bookcloud.java21.chapter11.Set接口实现类112;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

/** Set 接口实现类 112 */
public class SetExamples {
  public static void main(String[] args) {
    // 一、HashSet 事例,可以去重，无序
    Set<String> hashSet = new HashSet<>();
    hashSet.add("Apple");
    hashSet.add("Banana");
    hashSet.add("Cherry");
    // 重复元素
    hashSet.add("Banana");
    System.out.println("HashSet 中的元素为：" + hashSet);
    // 二、LinkedHashSet 事例,可以去重，有序
    Set<String> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add("Apple");
    linkedHashSet.add("Banana");
    linkedHashSet.add("Cherry");
    // 重复元素
    linkedHashSet.add("Banana");
    System.out.println("LinkedHashSet 中的元素为：" + linkedHashSet);
    // 打印set的大小
    System.out.println("HashSet 的大小为：" + hashSet.size());
    System.out.println("LinkedHashSet 的大小为：" + linkedHashSet.size());
    // 三、TreeSet 事例,总结一个特点：
    // 1. 有序
    // 2. 去重
    // 3. 自然排序
    Set<String> treeSet = new TreeSet<>();
    treeSet.add("Apple");
    treeSet.add("Banana");
    treeSet.add("Cherry");
    // 重复元素
    treeSet.add("Banana");
    System.out.println("TreeSet 中的元素为：" + treeSet);
    // 4. 自定义排序
    Set<String> treeSet2 = new TreeSet<>((s1, s2) -> s2.compareTo(s1));
    treeSet2.add("Apple");
    treeSet2.add("Banana");
    treeSet2.add("Cherry");
    treeSet2.add("D");
    System.out.println("TreeSet2 中的元素为：" + treeSet2);
    // 5. 自定义排序2
    Set<String> treeSet3 = new TreeSet<>((s1, s2) -> s1.length() - s2.length());
    treeSet3.add("Apple");
    treeSet3.add("Banana");
    treeSet3.add("Cherry");
    treeSet3.add("D");
    System.out.println("TreeSet3 中的元素为：" + treeSet3);
    // 三、set集合的操作
    // 1. 并集
    Set<String> union = new HashSet<>(treeSet);
    union.add("Banana");
    union.addAll(treeSet2);
    System.out.println("并集为：" + union);
    // 2. 交集
    Set<String> intersection = new HashSet<>(treeSet);
    intersection.retainAll(treeSet2);
    System.out.println("交集为：" + intersection);
    // 3. 差集
    Set<String> difference = new HashSet<>(treeSet);
    // set 集合的差集
    // 差集：A-B = A∪B - A∩B
    difference.removeAll(treeSet2);
    System.out.println("差集为：" + difference);
  }
}
